home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / include / fs.h < prev    next >
C/C++ Source or Header  |  1991-12-16  |  22KB  |  620 lines

  1. /*
  2.  * fs.h --
  3.  *
  4.  *    Definitions and types used in the user's interface to
  5.  *    the filesystem.
  6.  *
  7.  * Copyright 1985, 1988 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  * $Header: /sprite/src/lib/include/RCS/fs.h,v 1.21 91/12/04 14:27:03 jhh Exp $ SPRITE (Berkeley)
  17.  */
  18.  
  19. #ifndef _FS_H
  20. #define _FS_H
  21.  
  22. #include <spriteTime.h>
  23. #include <kernel/procTypes.h>
  24.  
  25. /*
  26.  * The macros major and minor are defined in sys/types.h.  They are also
  27.  * the names of fields in a structure defined in fs.h.  Only gcc and ANSI
  28.  * C are clever enough to handle this.  (The field name isn't followed
  29.  * by an open paren...)  So, if you include this file and <sys/types.h>
  30.  * then you can use the major() and minor() macros.  However, <sys/types.h>
  31.  * also defines unix_major() and unix_minor, so you can use those.
  32.  */
  33. #ifndef __STDC__ 
  34. #ifdef major
  35. #undef    major
  36. #endif
  37. #ifdef minor 
  38. #undef    minor
  39. #endif 
  40. #endif /* ! __STDC__ */
  41.  
  42. /*
  43.  * Global constants.
  44.  * FS_BLOCK_SIZE - the size of filesystem blocks
  45.  * FS_MAX_PATH_NAME_LENGTH - the maximum length of a complete pathname.
  46.  * FS_MAX_NAME_LENGTH - is the maximum length of one component of a name.
  47.  */
  48. #define    FS_BLOCK_SIZE        4096
  49. #define FS_MAX_PATH_NAME_LENGTH    1024
  50. #define FS_MAX_NAME_LENGTH    255
  51.  
  52.  
  53.  
  54. /*
  55.  * Open stream flags that are passed to Fs_Open from user programs.  These
  56.  *    flags are kept in a kernel data structure along with some other
  57.  *    flags used by the operating system internally.  This fact is only
  58.  *    important to pseudo-device and pseudo-file-system servers which
  59.  *    may see the other flags, which are defined in <kernel/fs.h>.
  60.  *
  61.  *    FS_READ        - open the file for read access.
  62.  *    FS_WRITE    - open the file for write access, can be combined
  63.  *              with FS_READ
  64.  *    FS_EXECUTE    - open the file for execute access.  This mode is used
  65.  *              by the kernel when opening a.out files.  It can
  66.  *              be used to limit the open to executables files.
  67.  *    FS_APPEND    - open for append mode. All writes get appended to the
  68.  *              end of the file regardless of the file pointer.
  69.  *    FS_CLOSE_ON_EXEC - close the stream when the process execs.
  70.  *    FS_NON_BLOCKING - I/O operations don't block (if applicable) but
  71.  *              instead return FS_WOULD_BLOCK.
  72.  *    FS_CREATE    - create the file if it doesn't exist.
  73.  *    FS_TRUNC    - truncate the file to zero length.
  74.  *    FS_EXCLUSIVE    - If specified with FS_CREATE the open/create will
  75.  *              fail if the file already exists.
  76.  *    FS_NAMED_PIPE_OPEN - Open as a named pipe. (NOT IMPLEMENTED)
  77.  *    FS_PDEV_MASTER     - Caller wants to be master of the pseudo-device.
  78.  *    FS_PFS_MASTER     - Caller wants to be server of the pseudo-filesystem.
  79.  */
  80. #define FS_USER_FLAGS              0xfff
  81. #define FS_READ                  0x001
  82. #define FS_WRITE              0x002
  83. #define FS_EXECUTE              0x004
  84. #define FS_APPEND              0x008
  85. #define FS_CLOSE_ON_EXEC        0x010
  86. #define FS_PDEV_MASTER            0x020
  87. #define FS_NAMED_PIPE_OPEN        0x040
  88. #define    FS_PFS_MASTER            0x080
  89. #define FS_NON_BLOCKING            0x100
  90. #define FS_CREATE              0x200
  91. #define FS_TRUNC              0x400
  92. #define FS_EXCLUSIVE              0x800
  93. /*            More high order bits are defined in <kernel/fs.h> !! */
  94.  
  95. /*
  96.  * Flags for Fs_Select:
  97.  *
  98.  *    FS_READABLE    - Does the stream have data that can be read?
  99.  *    FS_WRITABLE    - Can data be written to the stream?
  100.  *    FS_EXCEPTION    - Are there any exception conditions that have
  101.  *              raised for the stream? (e.g. out-of-band data).
  102.  */
  103.  
  104. #define FS_READABLE    FS_READ
  105. #define FS_WRITABLE    FS_WRITE
  106. #define FS_EXCEPTION    FS_EXECUTE
  107. #define FS_EXCEPTABLE    FS_EXCEPTION
  108.  
  109.  
  110.  
  111. /*
  112.  * The Fs_Attributes type is the information returned about a file
  113.  * from the Fs_GetAttributes and Fs_GetAttributesID system calls.
  114.  * This struct is also the input parameter for the Fs_SetAttributes
  115.  * and Fs_SetAttributesID system calls.
  116.  */
  117. typedef struct Fs_Attributes {
  118.     int    serverID;        /* Host ID of file server */
  119.     int domain;            /* Server-relative domain number of the file */
  120.     int fileNumber;        /* Domain-relative file number */
  121.     int type;            /* File types defined below */
  122.     int size;            /* Number of bytes in the file */
  123.     int numLinks;        /* Number of directory references to the file */
  124.     unsigned int permissions;    /* Permission bits defined below */
  125.     int uid;            /* User ID of file's owner */
  126.     int gid;            /* ID of file's owning group */
  127.     int devServerID;        /* ID of device server */
  128.     int devType;        /* Type of the device */
  129.     int devUnit;        /* Interpreted by the device driver */
  130.     Time createTime;        /* Time of the files creation */
  131.     Time accessTime;        /* Time of last access to the file */
  132.     Time descModifyTime;    /* Time the file descriptor was last modified */
  133.     Time dataModifyTime;    /* Time the file's data was last modified */
  134.     int  blocks;        /* The number of blocks taken by the file */
  135.     int  blockSize;        /* The size of each block */
  136.     int    version;        /* This is incremented when file is written */
  137.     int userType;        /* User defined file type */
  138.     int pad[4];            /* Reserved */
  139. } Fs_Attributes;
  140.  
  141. /*
  142.  * The following are values for the fileOrLink argument to Fs_Set/GetAttributes.
  143.  *    FS_ATTRIB_LINK    Get the attributes of the named link, not of the
  144.  *        file the link refers to.
  145.  *    FS_ATTRIB_FILE    Get the attributes of the name file.  If the last
  146.  *        component of the file name is a link then use the file
  147.  *        to which the link refers.
  148.  */
  149. #define FS_ATTRIB_LINK            1
  150. #define FS_ATTRIB_FILE            2
  151.  
  152. /*
  153.  * The following are values for the flags passed to Fs_SetAttr and Fs_SetAttrID
  154.  *    FS_SET_ALL_ATTRS - Attempt to set all settable attributes (see below)
  155.  *    FS_SET_TIMES    - Set data modify and file access times.
  156.  *    FS_SET_MODE    - Set the permission mode bits of the file.
  157.  *    FS_SET_OWNER    - Set the owner and group owner of a file.
  158.  *    FS_SET_FILE_TYPE - Set the user-defined file type of a file.
  159.  *    FS_SET_DEVICE    - Set device attributes - server, type, unit
  160.  */
  161. #define FS_SET_ALL_ATTRS    0x1F
  162. #define FS_SET_TIMES        0x01
  163. #define FS_SET_MODE        0x02
  164. #define FS_SET_OWNER        0x04
  165. #define FS_SET_FILE_TYPE    0x08
  166. #define FS_SET_DEVICE        0x10
  167.  
  168. /*
  169.  * FS_LOCALHOST_ID is used as the device server ID for generic devices,
  170.  * those expected to exist on all hosts.  It is also used in the kernel
  171.  * when the "ioServerID" is the local host.
  172.  */
  173. #define FS_LOCALHOST_ID        -1
  174.  
  175. /*
  176.  * File types kept in FsFileDescriptors on disk:
  177.  *    FS_FILE            ordinary disk file
  178.  *    FS_DIRECTORY        file used to implement the directory stucture
  179.  *    FS_SYMBOLIC_LINK    regular file used to implement links
  180.  *    FS_REMOTE_LINK        symbolic link used to mark the top of a domain
  181.  *    FS_DEVICE        Placeholder for peripheral device
  182.  *    FS_REMOTE_DEVICE    not used
  183.  *    FS_LOCAL_PIPE        Temporary half-duplex pipe
  184.  *    FS_NAMED_PIPE        Persistent half-duplex pipe (not implemented)
  185.  *    FS_PSEUDO_DEV        Full duplex communication to a user process
  186.  *    FS_PSEUDO_FS        Marks a domain controlled by a user process
  187.  *    FS_XTRA_FILE        Extra file type used to stage the
  188.  *                (re)implementation of standard file types
  189.  */
  190.  
  191. #define    FS_FILE                0
  192. #define    FS_DIRECTORY            1
  193. #define    FS_SYMBOLIC_LINK        2
  194. #define    FS_REMOTE_LINK            3
  195. #define    FS_DEVICE            4
  196. #define    FS_REMOTE_DEVICE        5
  197. #define    FS_LOCAL_PIPE            6
  198. #define    FS_NAMED_PIPE            7
  199. #define    FS_PSEUDO_DEV            8
  200. #define FS_PSEUDO_FS            9
  201. #define FS_XTRA_FILE            10
  202.  
  203.  
  204. /*
  205.  * User-defined file types.  A number of types are standardized, but others
  206.  * may be defined by the user.
  207.  *
  208.  *     FS_USER_TYPE_UNDEFINED        - no type set
  209.  *     FS_USER_TYPE_TMP              - temporary file
  210.  *     FS_USER_TYPE_SWAP             - swap file
  211.  *     FS_USER_TYPE_OBJECT           - ".o" file
  212.  *     FS_USER_TYPE_BINARY           - executable
  213.  *     FS_USER_TYPE_OTHER           - file that doesn't correspond to any
  214.  *                      specific type.  This is distinct from
  215.  *                      undefined, which says the type is
  216.  *                      uninitialized and may be inferred by
  217.  *                      parent directory or file name.
  218.  */
  219. #define FS_USER_TYPE_UNDEFINED  0
  220. #define FS_USER_TYPE_TMP        1
  221. #define FS_USER_TYPE_SWAP    2
  222. #define FS_USER_TYPE_OBJECT    3
  223. #define FS_USER_TYPE_BINARY    4
  224. #define FS_USER_TYPE_OTHER    5
  225.  
  226.  
  227. /*
  228.  * The Fs_FileID and Fs_UserIDs types are exported to user-level so that
  229.  * pseudo-filesystem servers can understand the arguments to lookup operations
  230.  * that are defined in fsNameOps.h
  231.  *
  232.  * Fs_FileID - Uniquely identify a filesystem object.  A type is the first
  233.  *    field, the hostID of the server is next, and the remaining fields 
  234.  *    are interpreted by the implementation of that type of filesystem object
  235.  *    (ie. files, devices, pipes, pseudo-devices, etc.)
  236.  *    A global hash table of filesystem objects, (called "handles")
  237.  *    is maintained with this Fs_FileID as the hash key.
  238.  */
  239. typedef struct Fs_FileID {
  240.     int        type;        /* Defined in kernel fsio.h (stream types).
  241.                  * Used in I/O switch, and implicitly
  242.                  * indicates what kind of structure follows
  243.                  * the FsHandleHeader in the Handle. */
  244.     int        serverID;    /* Host that controls the object.  (This would
  245.                  * have to be a multi-cast ID for objects
  246.                  * that support replication.) */
  247.     int        major;        /* First type specific identifier. */
  248.     int        minor;        /* Second type sepcific identifier. */
  249. } Fs_FileID;            /* 16 BYTES */
  250.  
  251. /*
  252.  *    The FS_NUM_GROUPS constant limits the number of group IDs that
  253.  *    are used even though the proc table supports a variable number.
  254.  */
  255. #define FS_NUM_GROUPS    8
  256.  
  257. typedef struct Fs_UserIDs {
  258.     int user;            /* Indicates effective user ID */
  259.     int numGroupIDs;        /* Number of valid entries in groupIDs */
  260.     int group[FS_NUM_GROUPS];    /* The set of groups the user is in */
  261. } Fs_UserIDs;            /* 40 BYTES */
  262.  
  263.  
  264.  
  265.  
  266. /*
  267.  * Generic IO Control operations.
  268.  *    IOC_REPOSITION        Reposition the current offset into the file.
  269.  *    IOC_GET_FLAGS        Return the flags associated with the stream.
  270.  *    IOC_SET_FLAGS        Set all the flags for the stream.
  271.  *    IOC_SET_BITS        Set some of the flags for the stream.
  272.  *    IOC_CLEAR_BITS        Clear some of the flags for the stream.
  273.  *    IOC_TRUNCATE        Truncate the stream to a given length.
  274.  *    IOC_LOCK        Lock the stream or underlying file.
  275.  *    IOC_UNLOCK        Unlock the stream.
  276.  *    IOC_NUM_READABLE    Return the number of bytes available.
  277.  *    IOC_GET_OWNER        Return the process or family that gets signals.
  278.  *    IOC_SET_OWNER        Set the process or family that gets signals.
  279.  *    IOC_MAP            Map the stream into the processes VM
  280.  *    IOC_PREFIX        Get the prefix under which the stream was
  281.  *                opened.  This is useful if a server is exporting
  282.  *                a domain under more than one name.  The getwd()
  283.  *                library call uses this feature.
  284.  *    IOC_WRITE_BACK        Write back any cached stream data.
  285.  *    IOC_MMAP_INFO        Provide server with information on
  286.  *                VM memory mapping.
  287.  *
  288.  *    IOC_GENERIC_LIMIT    This is the maximum IOC number that can be
  289.  *                used for the generic I/O controls supported
  290.  *                by the kernel.  Device drivers define I/O
  291.  *                control numbers above this limit.  This limit
  292.  *                is used in the kernel to optimize handling
  293.  *                generic vs. non-generic I/O controls.
  294.  */
  295.  
  296. #define    IOC_REPOSITION            1
  297. #define    IOC_GET_FLAGS            2
  298. #define IOC_SET_FLAGS            3
  299. #define IOC_SET_BITS            4
  300. #define IOC_CLEAR_BITS            5
  301. #define IOC_TRUNCATE            6
  302. #define IOC_LOCK            7
  303. #define IOC_UNLOCK            8
  304. #define IOC_NUM_READABLE        9
  305. #define IOC_GET_OWNER            10
  306. #define IOC_SET_OWNER            11
  307. #define IOC_MAP                12
  308. #define IOC_PREFIX            13
  309. #define IOC_WRITE_BACK            14
  310. #define    IOC_MMAP_INFO            15
  311. #define IOC_GENERIC_LIMIT        ((1<<16)-1)
  312.  
  313. /*
  314.  * Maximum number of bytes that be copied in on an iocontrol.
  315.  */
  316.  
  317. #define    IOC_MAX_BYTES    4096
  318.  
  319.  
  320. /*
  321.  * IOC_REPOSITION - reposition the file access position.
  322.  */
  323.  
  324. typedef struct Ioc_RepositionArgs {
  325.     int base;    /* Base at which to start reposition: defines below */
  326.     int offset;    /* Offset from base */
  327. } Ioc_RepositionArgs;
  328.  
  329. /*
  330.  * Base argument definitions:
  331.  *    IOC_BASE_ZERO        base is the beginning of the file.
  332.  *    IOC_BASE_CURRENT    base is the current position in the file.
  333.  *    IOC_BASE_EOF        base is the end of the file.
  334.  */
  335.  
  336. #define IOC_BASE_ZERO        0
  337. #define IOC_BASE_CURRENT    1
  338. #define IOC_BASE_EOF        2
  339.  
  340.  
  341.  
  342. /*
  343.  *    IOC_GET_FLAGS        Return the flags associated with the stream.
  344.  *    IOC_SET_FLAGS        Set all the flags for the stream.
  345.  *    IOC_SET_BITS        Set some of the flags for the stream.
  346.  *    IOC_CLEAR_BITS        Clear some of the flags for the stream.
  347.  *
  348.  *    A few of the low order bits in the flags field are reserved
  349.  *    for use by the kernel.  The rest bits are left for interpretation
  350.  *    by the (pseudo) device driver.
  351.  *        IOC_APPEND    Do append mode writes to the stream
  352.  *        IOC_NON_BLOCKING Do not block if I/O is not ready
  353.  *        IOC_ASYNCHRONOUS Dispatch I/O and signal when complete
  354.  *                 This is not implemented yet, 6/87
  355.  *        IOC_CLOSE_ON_EXEC This forces the stream to be closed when
  356.  *                the process execs another program.
  357.  *        IOC_READ    Stream is open for reading.
  358.  *        IOC_WRITE    Stream is open for writing.
  359.  */
  360.  
  361. #define IOC_GENERIC_FLAGS    0xFF
  362. #define    IOC_APPEND        0x01
  363. #define IOC_NON_BLOCKING    0x02
  364. #define IOC_ASYNCHRONOUS    0x04
  365. #define IOC_CLOSE_ON_EXEC    0x08
  366. #define IOC_READ        0x10
  367. #define IOC_WRITE        0x20
  368.  
  369.  
  370. /*
  371.  *    IOC_LOCK        Lock the stream or underlying file.
  372.  *    IOC_UNLOCK        Unlock the stream.
  373.  */
  374. typedef struct Ioc_LockArgs {
  375.     int        flags;        /* IOC_LOCK_EXCLUSIVE, no other locks allowed
  376.                  * IOC_LOCK_SHARED, can have many of these,
  377.                  *    but no exclusive locks 
  378.                  * IOC_LOCK_NO_BLOCK, don't block if the lock
  379.                  *    can't be obtained, return FS_WOUD_BLOCK
  380.                  */
  381.     /*
  382.      * The following fields are set by the kernel and used by
  383.      * lower levels to notify when the lock is obtainable.  Pseudo-device
  384.      * masters use IOC_PDEV_LOCK_READY IOControl to do this notify.
  385.      */
  386.     int        hostID;        /* Set by the kernel */
  387.     Proc_PID    pid;        /* Set by the kernel */
  388.     int        token;        /* Set by the kernel */
  389. } Ioc_LockArgs;
  390.  
  391. #define IOC_LOCK_SHARED            0x1
  392. #define IOC_LOCK_EXCLUSIVE        0x2
  393. #define IOC_LOCK_NO_BLOCK        0x8
  394.  
  395. /*
  396.  *    IOC_GET_OWNER        Return the process or family that gets signals.
  397.  *    IOC_SET_OWNER        Set the process or family that gets signals.
  398.  */
  399. typedef struct Ioc_Owner {
  400.     Proc_PID    id;        /* Process or Family ID */
  401.     int        procOrFamily;    /* IOC_OWNER_FAMILY or IOC_OWNER_PROC */
  402. } Ioc_Owner;
  403.  
  404. #define IOC_OWNER_FAMILY    0x1
  405. #define IOC_OWNER_PROC        0x2
  406.  
  407. /*
  408.  *    IOC_MAP            Map the stream into the processes VM
  409.  */
  410. typedef struct Ioc_MapArgs {
  411.     int        numBytes;
  412.     Address    address;
  413. } Ioc_MapArgs;
  414.  
  415. /*
  416.  *    IOC_PREFIX        Return prefix under which stream was opened.
  417.  */
  418. typedef struct Ioc_PrefixArgs {
  419.     char    prefix[FS_MAX_PATH_NAME_LENGTH];  /* Set by kernel */
  420. } Ioc_PrefixArgs;
  421.  
  422. /*
  423.  *    IOC_WRITE_BACK        Write back the cached data of a file.
  424.  *                Although the arguments are in terms
  425.  *                of bytes, the cache will block align
  426.  *                the write-back so the bytes are fully
  427.  *                included in the blocks written back.
  428.  */
  429. typedef struct Ioc_WriteBackArgs {
  430.     int        firstByte;    /* Index of first byte to write back */
  431.     int        lastByte;    /* Index of last byte to write back */
  432.     Boolean    shouldBlock;    /* If TRUE, call blocks until write back done */
  433. } Ioc_WriteBackArgs;
  434.  
  435. /*
  436.  *    IOC_MMAP_INFO        Give information to the server that a
  437.  *                client is mapping a stream into memory.
  438.  */
  439. typedef struct Ioc_MmapInfoArgs {
  440.     int        isMapped;    /* 1 if mapping, 0 if unmapping. */
  441.     int        clientID;    /* ID of the requesting client. */
  442. } Ioc_MmapInfoArgs;
  443.  
  444. /*
  445.  * A mask of 9 permission bits is used to define the permissions on a file.
  446.  * A mask like this occurs in the FileDescriptor for a file.  A mask like
  447.  * this is also part of the state of each process.  It defines the maximal
  448.  * set of permissions that a newly created file can have. The following
  449.  * define the various permission bits.
  450.  *    FS_OWNER_{READ|WRITE|EXEC}    A process with a UID that matches the
  451.  *            file's UID has {READ|WRITE|EXEC} permission on the file.
  452.  *    FS_GROUP_{READ|WRITE|EXEC}    A process with one of its group IDS
  453.  *            that matches the file's GID has permission...
  454.  *    FS_WORLD_{READ|WRITE|EXEC}    Any process has permission if WORLD
  455.  *            permission bits are set.
  456.  */
  457. #define FS_OWNER_READ            00400
  458. #define FS_OWNER_WRITE            00200
  459. #define FS_OWNER_EXEC            00100
  460. #define FS_GROUP_READ            00040
  461. #define FS_GROUP_WRITE            00020
  462. #define FS_GROUP_EXEC            00010
  463. #define FS_WORLD_READ            00004
  464. #define FS_WORLD_WRITE            00002
  465. #define FS_WORLD_EXEC            00001
  466.  
  467. /*
  468.  * Other permission bits:
  469.  *    FS_SET_UID    This bit set on a program image or shell script
  470.  *        causes the execed process to take on the user id of
  471.  *        the file.  (Thanks to Dennis Ritchie for this great idea.)
  472.  *    FS_SET_GID    As above, but for the group id.
  473.  */
  474. #define FS_SET_UID            04000
  475. #define FS_SET_GID            02000
  476.  
  477.  
  478.  
  479. /*
  480.  * Values of the mode argument to the Fs_CheckAccess system call.
  481.  *    FS_EXISTS    does the file exists (can the caller see it)
  482.  *    FS_READ        does the caller have read access
  483.  *    FS_WRITE    does the caller have write access
  484.  *    FS_EXECUTE    does the caller have execution access
  485.  */
  486. #define FS_EXISTS        0x0
  487.  
  488. /*
  489.  * Flag to Fs_GetNewID call that says choose any new stream ID.
  490.  */
  491. #define FS_ANYID            -1
  492.  
  493. /*
  494.  * The Fs_AttachDisk system call takes flags that affect just what is
  495.  * done with the disk partition and the associated prefix.
  496.  *    FS_ATTACH_READ_ONLY    Set the disk up to be read only.
  497.  *    FS_DETACH        The disk becomes inaccessible.  Any modified
  498.  *                filesystem data is flushed first.
  499.  *    FS_ATTACH_LOCAL        The disk is attached locally and not exported
  500.  *    FS_DEFAULT_DOMAIN    The domain is being attached by the kernel
  501.  *                during boot as the default.
  502.  *
  503.  */
  504. #define FS_ATTACH_READ_ONLY        0x1
  505. #define FS_DETACH            0x2
  506. #define FS_ATTACH_LOCAL            0x4
  507. #define FS_DEFAULT_DOMAIN        0x8
  508.  
  509. typedef struct Fs_TwoPaths {
  510.     int        pathLen1;    /* Length of the first path, including null */
  511.     int        pathLen2;    /* Length of the second path, including null */
  512.     char     *path1;        /* First pathname */
  513.     char     *path2;        /* Second pathname */
  514. } Fs_TwoPaths;
  515.  
  516. /*
  517.  * Information about a file system domain (volume).
  518.  */
  519. typedef struct {
  520.     int    maxKbytes;        /* Total Kbytes in the domain.  The allocation
  521.                  * routine might reserve some (%10) of this */
  522.     int    freeKbytes;        /* The number of available blocks.  This
  523.                  * reflects any reservations made by the
  524.                  * allocator.  If this is positive, blocks
  525.                  * are available. */
  526.     int    maxFileDesc;        /* The total number of files that can be
  527.                  * created in the domain. */
  528.     int    freeFileDesc;        /* The number of free file descriptors */
  529.     int blockSize;        /* Bytes per block */
  530.     int optSize;        /* Optimal transfer size, in bytes */
  531. } Fs_DomainInfo;
  532.  
  533.  
  534. /*
  535.  * User visible prefix table entry.  This is used by the routine that
  536.  * copies individual entries out to user programs.
  537.  */
  538. #define FS_USER_PREFIX_LENGTH    64
  539. #define FS_NO_SERVER        0
  540. typedef struct Fs_Prefix {
  541.     int serverID;        /* From FsFileID of prefix, FS_NO_SERVER if 
  542.                  * no handle */
  543.     int domain;            /* ditto */
  544.     int fileNumber;        /* ditto */
  545.     int version;        /* ditto */
  546.     int flags;            /* Defined below */
  547.     char prefix[FS_USER_PREFIX_LENGTH];
  548.     Fs_DomainInfo domainInfo;    /* Information about the domain. */
  549. } Fs_Prefix;
  550.  
  551. #ifndef FS_EXPORTED_PREFIX
  552. #define    FS_EXPORTED_PREFIX        0x1
  553. #define    FS_IMPORTED_PREFIX        0x2
  554. #define    FS_LOCAL_PREFIX            0x4
  555. #endif
  556.  
  557.  
  558. /*
  559.  * The Fs_ReadVector and Fs_WriteVector system calls take an array of
  560.  * I/O vectors. This allows data to be read to or written from non-contiguous
  561.  * areas of memory.
  562.  */
  563. typedef struct {
  564.     int        bufSize;    /* Size in bytes of the buffer */
  565.     Address    buffer;        /* For Fs_WriteVector, data to be written.
  566.                  * For Fs_ReadVector, place where read data 
  567.                  * is stored. */
  568. } Fs_IOVector;
  569.  
  570.  
  571. /*
  572.  * The structure below is use for creating devices with Fs_MakeDevice.
  573.  * It's also used internally by the kernel to hold the information passed
  574.  * to device specific routines so they can operate on their particular device.
  575.  */
  576. typedef struct Fs_Device {
  577.     int        serverID;    /* The host ID of the server that controls
  578.                  * the device. */
  579.     int        type;        /* The type of device.  This field is used to
  580.                  * index into an operation switch */
  581.     int        unit;        /* Type dependent unit specification. The
  582.                  * interpretation is up to the device driver */
  583.     ClientData    data;        /* Device type dependent data. This can be set
  584.                  * during the device open routine and should
  585.                  * be cleaned up in the device close routine. */
  586. } Fs_Device;
  587.  
  588. /*
  589.  * Definitions for the FS dispatcher library.
  590.  */
  591. typedef ClientData Fs_TimeoutHandler;
  592.  
  593. extern void            Fs_Dispatch();
  594. extern void            Fs_EventHandlerCreate();
  595. extern void             Fs_EventHandlerDestroy();
  596. extern ClientData         Fs_EventHandlerData();
  597. extern ClientData         Fs_EventHandlerChangeData();
  598. extern char            *Fs_GetTempName();
  599. extern int            Fs_GetTempFile();
  600. extern int                  Fs_IOControl();
  601. extern Boolean            Fs_IsATerm();
  602. extern Fs_TimeoutHandler    Fs_TimeoutHandlerCreate();
  603. extern void             Fs_TimeoutHandlerDestroy();
  604.  
  605. extern int                  Ioc_ClearBits();
  606. extern int                  Ioc_GetFlags();
  607. extern int                  Ioc_GetOwner();
  608. extern int                  Ioc_Lock();
  609. extern int                  Ioc_Map();
  610. extern int                  Ioc_NumReadable();
  611. extern int                  Ioc_SetBits();
  612. extern int                  Ioc_Reposition();
  613. extern int                  Ioc_SetFlags();
  614. extern int                  Ioc_SetOwner();
  615. extern int                  Ioc_Truncate();
  616. extern int                  Ioc_Unlock();
  617. extern int                  Ioc_WriteBack();
  618.  
  619. #endif /* _FS_H */
  620.